﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace iri10
{
    public partial class frmPedido : Form
    {
        string error;

        public frmPedido()
        {
            InitializeComponent();
        }

        private void frmPedido_Load(object sender, EventArgs e)
        {
            //TODO ver este index
            String []listaCliente = new String[5];

            //Costo
            lblPrecio.Text = "$ " + pcActual.PcActual.FPrecio.ToString();

            //cargo el número de pedido
            lblNumeroPedido.Text = "Número de Orden: " + NegPedido.getProximoNumeroPedido().ToString();

            //cargo los datos del cliente
            listaCliente[0] = "Nombre: " + (txtNombre.Text = usuarioActual.User.SNombre);
            listaCliente[1] = "Apellido: " + (txtApellido.Text = usuarioActual.User.SApellido);
            listaCliente[2] = "DNI: " + (txtDni.Text = usuarioActual.User.DNI);
            listaCliente[3] = "Teléfono: " + (txtTeléfono.Text = usuarioActual.User.STeléfono);
            listaCliente[4] = "E-Mail: " + usuarioActual.User.SEMail; 

            txtCalle.Text = usuarioActual.User.DDirección.Calle;
            txtCiudad.Text = usuarioActual.User.DDirección.Ciudad;
            txtCp.Text = usuarioActual.User.DDirección.CP.ToString();
            txtDepartamento.Text = usuarioActual.User.DDirección.Departamento;
            txtNumero.Text = usuarioActual.User.DDirección.Número.ToString();
            txtPais.Text = usuarioActual.User.DDirección.País;
            txtPiso.Text = usuarioActual.User.DDirección.Piso;
            txtProvincia.Text = usuarioActual.User.DDirección.Provincia;

            lstCliente.Items.AddRange(listaCliente);

            //Cargo los componentes
            lstListaComponentes.Items.Add("PC Modelo:" + pcActual.PcActual.SModelo);
            lstListaComponentes.Items.AddRange(pcActual.PcActual.CompObligatorios);
            lstListaComponentes.Items.AddRange(pcActual.PcActual.CompModificable);
            lstListaComponentes.Items.AddRange(pcActual.PcActual.CompEliminable);

            //Cargo la fecha
            lblFecha.Text = DateTime.Now.Date.ToString();

        }

        private void btnComprar_Click(object sender, EventArgs e)
        {

        }

        private void frmPedido_Shown(object sender, EventArgs e)
        {
            //Final x=163  Y=58

            int oPos = -Height; //Escondido
            Point p = new Point(163, oPos);

            for (int iCont = 0; iCont <= 25; iCont++)
            {
                p.Y = oPos - (oPos - 58) / 25 * iCont;
                Application.DoEvents();
                this.Location = p;
            }
        }

        private void picNext_Click(object sender, EventArgs e)
        {
            Pedido p = new Pedido();

            //Cargo los datos del destinatario en el pedido
            p.SNombre = txtNombre.Text;
            p.SApellido = txtApellido.Text;
            p.sDNI = txtDni.Text;
            p.STelefono = txtTeléfono.Text;
            p.User = usuarioActual.User;
            p.Pc = pcActual.PcActual;
            p.Id = NegPedido.getProximoNumeroPedido();

            //Cargo la dirección de envío
            p.Direccion.Calle = txtCalle.Text;
            p.Direccion.Ciudad = txtCiudad.Text;
            p.Direccion.CP = Convert.ToUInt32(txtCp.Text);
            p.Direccion.Departamento = txtDepartamento.Text;
            p.Direccion.Número = Convert.ToUInt32(txtNumero.Text);
            p.Direccion.País = txtPais.Text;
            p.Direccion.Piso = txtPiso.Text;
            p.Direccion.Provincia = txtProvincia.Text;
            p.Fecha = DateTime.Now;

            if (validarDatosPedido(p))
            {


                if (radTransferencia.Checked)
                    p.FormaDePago = "Transferencia";
                else
                    if (radTarjetaCredito.Checked)
                        p.FormaDePago = "TarjetaCredito";
                    else
                        p.FormaDePago = "Contada";

                //Guardo la computadora
                NegPedido.almacenarPedido(p);

                NegVentanas.showComprado();
            }
            else
            { 
            
            }
        }

        private void picBack_Click(object sender, EventArgs e)
        {
            NegVentanas.showPersonalizar();
        }

        private void frmPedido_FormClosing(object sender, FormClosingEventArgs e)
        {
            ocultar();
        }

        public void ocultar()
        {
            //x=163  Y=58

            Point p = new Point();
            p.X = 163;
            p.Y = Location.Y;

            for (int iCont = 25; iCont >= 0; iCont--)
            {
                p.Y -= (58 + this.Height) / 25;
                this.Location = p;
                Application.DoEvents();
            }
        }

        private bool validarDatosPedido(Pedido p)
        {

            error = "";
            
            //validacion nombre
            if (txtNombre.Text.Length == 0)
                error = error + "Ingrese el Nombre. \r\n";
            else
            {
                if (!validar_Nombre_App(txtNombre.Text))
                    error = error + "Formato de nombre no válido \r\n";
            }

            //validación apellido
            if (txtApellido.Text.Length == 0)
                error = error + "Ingrese el Apellido. \r\n";
            else
            {
                if (!validar_Nombre_App(txtApellido.Text))
                    error = error + "Formato de apellido no válido \r\n";
            }

            //validación dni
            if (txtDni.Text.Length == 0)
                error = error + "Ingrese el DNI. \r\n";
            else
            {       //si el formato del dni es correcto
                if (!ValidarDni(txtDni.Text))
                {
                    error = error + "El DNI ingresado no es válido. \r\n";
                }
            }

            //validación país
            if (txtPais.Text.Length == 0)
                error = error + "Ingrese el Pais. \r\n";
            else
            {       
                if (!validar_Nombre_App(txtPais.Text))
                {
                    error = error + "El Pais ingresado no es válido. \r\n";
                }
            }

            //validación provincia
            if (txtProvincia.Text.Length == 0)
                error = error + "Ingrese la provincia. \r\n";
            else
            {
                if (!validar_Nombre_App(txtProvincia.Text))
                {
                    error = error + "La provincia ingresada no es válida. \r\n";
                }
            }

            //validacion codigo postal
            if (txtCp.Text.Length == 0)
                error = error + "Ingrese el codigo postal. \r\n";
            else
            {
                if (!soloDigitos(txtCp.Text))
                {
                    error = error + "El código postal ingresado no es válido. \r\n";
                }
            }

            //validacion numero direccion
            if (txtNumero.Text.Length == 0)
                error = error + "Ingrese el numero de la dirección. \r\n";
            else
            {
                if (!soloDigitos(txtNumero.Text))
                {
                    error = error + "El número de la dirección ingresado no es válido. \r\n";
                }
            }

            //validacion telefono
            if (txtTeléfono.Text.Length == 0)
                error = error + "Ingrese el telefono. \r\n";
            else
            {
                if (!soloDigitos(txtTeléfono.Text))
                {
                    error = error + "El teléfono ingresado no es válido. \r\n";
                }
            }

           
            


            //si se producen errores
            if (error.Length > 0)
            {
                error = "Se han producido errores: \r\n" + error;
                MessageBox.Show(error);

            }


            //si no hubo errores
            if (error == "")
            {
                return true;

            }

            return false;


        }



        public bool ValidarDni(string dni)
        {

            if (dni.Length > 9)
                return false;
            else
            {
                if (dni.Length < 8)
                    return false;
            }

            if (dni.Length == 9)
            {
                if (dni[8] != 'F' && dni[8] != 'M')
                    return false;

            }


            for (int i = 0; i < 8; i++)
            {
                if (!char.IsDigit(dni[i]))
                    return false;
            }

            return true;
        }


        public bool soloDigitos(string dato)
        {
            for (int i = 0; i < dato.Length; i++)
            {
                if (!char.IsDigit(dato[i]))
                    return false;
            }

            return true;

        }

       

        /// <summary>
        /// Valida caracteres validos para el nombre y apellido
        /// </summary>
        /// <example>
        /// andres gomez
        /// juan.gonzales
        /// 
        /// </example>
        /// <param name="cadena">Nombre o apellido a validar</param>
        /// <returns>
        /// true: si es valido
        /// false: si no es valido
        ///</returns>
        public bool validar_Nombre_App(String cadena)
        {
            if (cadena == "")
                return false;

            bool valido = true;

            foreach (char c in cadena)
            {
                if (Char.IsLetter(c) || char.IsWhiteSpace(c))
                {
                    valido = true;
                }
                
                else
                    return false;


            }

            return valido;
        }

        /// <summary>
        /// Valida caracteres validos para campo telefono 7 x [0-9]
        /// </summary>
        /// <param name="cadena">telefono a validar en formato String</param>
        /// <returns>
        /// true: si es valido  
        /// false: si no es valido 
        /// </returns>
        public bool validar_Telefono(String cadena)
        {

            bool valido = true;

            if (cadena.Length > 9 || cadena.Length < 5)
                return false;

            foreach (char c in cadena)
            {
                if (Char.IsDigit(c))
                {
                    valido = true;
                }
                else
                    return false;


            }

            return valido;
        }

        /// <summary>
        /// Valida caracteres validos para campo caracteristica 5 x [0-9]
        /// </summary>
        /// <param name="cadena">caracteristica a validar en formato String</param>
        /// <returns>
        /// true: si es valido  
        /// false: si no es valido 
        /// </returns>
        public bool validar_Caracteristica(String cadena)
        {

            bool valido = true;

            if (cadena.Length > 5 || cadena.Length < 3)
                return false;

            foreach (char c in cadena)
            {
                if (Char.IsDigit(c))
                {
                    valido = true;
                }
                else
                    return false;


            }

            return valido;
        }
        
    }
}
